package com.xuz.proxy;

import com.xuz.proxy.example01.IUserDao;
import com.xuz.proxy.example01.UserDaoImpl;
import com.xuz.proxy.example01.UserDaoProxy;
import com.xuz.proxy.example02.ProxyFactory;
import com.xuz.proxy.example03.User;
import com.xuz.proxy.example03.UserLogProxy;
import com.xuz.proxy.example03.UserServiceImpl;
import org.junit.Test;

import java.util.List;

/**
 * 测试类
 * @user 65453
 * @date 2024/10/9 21:23
 */
public class TestProxy {
    /**
     * 静态代理
     *  优点：可以在不修改目标类的前提下，拓展目标类的功能
     *  缺点：
     *      1、冗余，由于代理对象要实现和目标对象一致的接口，会产生很多的代理
     *      2、不宜维护，一旦接口中增加方法，目标对象和代理对象都要进行修改
     */
    @Test
    public void testStaticProxy(){

        //目标对象
//        UserDaoImpl userDao = new UserDaoImpl();
        IUserDao userDao = new UserDaoImpl();
        //代理对象
        UserDaoProxy proxy = new UserDaoProxy(userDao);
        proxy.save();
    }

    //测试
    public static void main(String[] args) {
        IUserDao target = new UserDaoImpl();
        System.out.println(target.getClass());//目标对象信息

        IUserDao proxy = (IUserDao) new ProxyFactory(target).getProxyInstance();
        System.out.println(proxy.getClass()); //输出代理对象信息
        proxy.save(); //执行代理方法
    }

    @Test
    public void testCglibProxy(){
        //目标对象
        UserServiceImpl userService = new UserServiceImpl();
        System.out.println(userService.getClass());
        //代理对象
        UserServiceImpl proxy = (UserServiceImpl) new UserLogProxy().getLogProxy(userService);
        System.out.println(proxy.getClass());

        List<User> userList = proxy.findUserList();
        System.out.println("用户信息："+userList);
    }
}
